Photo on selenium
從幾個禮拜前的 "鼠年全馬鐵人挑戰 WEEK 06:Selenium 自動化測試工具" 文章開始,已經介紹了 Selenium、Selenium IDE、Selenium WebDriver,而到了這週也即將進入尾聲了,也就是最後的 Selenium Grid。那就廢話不多說,開始這禮拜的介紹吧~
Monitor, Network Drive, Windows Client, Mac Client, Cell Phone, iPhone by Icons8
Hub 是一個所有測試發送的中心點。
每一個 Selenium Grid 僅由一個 hub 組成。
該 hub 需要可以從相對應的客戶端(Client)啟動。
該 hub 將連接一個或是多個 nodes 進行委託測試。
太難理解了嗎? 不然小弟舉個例子好了~
可以把 Client 想像成使用客戶。
Hub 就是接收客戶請求的專案經理。
Nodes 則是完成該專案的專案工程師們。
- 專案經理(hub)需要做的事情就是,把客戶端(client)提出的請求(test),進行適當的分配,給每個專案工程師(nodes)進行處理。
Nodes 將在各個系統上執行測試。
作為 node 的機器不必與 hub 或其他 node 具有相同的平台或瀏覽器。
這邊也舉個情境案例來做說明好了~
今天測試員在 Mac 的系統上,啟動了 hub。
此時測試員可以在 Windows 的系統上啟動 瀏覽器為 IE 的 node。
因為這在 Linux 或 Mac 上是不可能達成的。
Grid 利用多台機器設備並行測試來分散測試的執行時間。
就像是把 100 個測試分給 4 台機器設備來執行
測試時間就可以縮短為四分之一
Grid 還可以支援多個環境執行測試。
也就是說每個機器設備都有所支援的瀏覽器。
機器設備1 使用 Internet Explorer 8
機器設備2 使用 Internet Explorer 9
機器設備3 使用 最新版的 Chrome
機器設備4 使用 最新版的 Firefox
而執行測試時 Selenium Grid 會分配每個測試以其所需的瀏覽器執行。
Grid 可以包含相同瀏覽器,類型和版本。
像是有 4 台機器設備使用了 Grid
每台機器設備都執行了 3 個 firefox 70
這樣一來就有如同時執行了 12 個測試
大大減少了完成測試所需的時間
最主要的當然是先安裝我們這禮拜的主角 Selenium Grid。
下載 Selenium Server (Grid)。 點我下載: 3.141.59 版本
或是自行到官方網站進行下載。 https://www.selenium.dev/downloads/
因為需要使用到 java 命令列(cmd)工具,所以需要安裝 JDK。
Java SE-下載|Oracle技術網|甲骨文
可以依照自己的作業系統,安裝想要的版本
小弟是直接裝最新版的 Java SE 14
建立一個新資料夾吧~ (可做可不做,看個人)
如果想要手動操作就忽略下面這一行,懶得操作的就來複製貼上吧 XD$ mkdir selenium_grid
將 初始作業 安裝的 selenium-server-standalone
拉進剛剛建立的 selenium_grid 資料夾吧~
然後就是 ...
執行下面的指令,來啟動 hub$ java -jar selenium-server-standalone-<version>.jar -role hub
Hub 預設的監聽 port 號是 4444。
可以點這個連結 http://localhost:4444/grid/console 看看 hub 的狀態 。
有沒有跟我一樣的大哥大姐覺得 4444 的 port 號,看起來不太順眼。
沒關係~ 可以再啟動 hub 的時候多一個指令來設定監聽的 port 號。$ java -jar selenium-server-standalone-<version>.jar -role hub -port <port>
$ java -jar selenium-server-standalone-<version>.jar -role node -hub http://localhost:4444
把程式碼貼到 cmd 中,沒錯 生活就是這麼的乾脆 (沒事 不要理我~)。
重新整理 步驟 1 中開啟的連結 http://localhost:4444/grid/console。
整理完頁面之後 就會發現多了一些東西。
為什麼會多出這些瀏覽器呢?指令中並沒有指定啊~
其實是啟動 nodes 的預設瀏覽器。
如果是用 Mac 的話預設瀏覽器為 5個 Firefox、5個 Chrome、1個 Safari。
如果是用 Windows 的話預設瀏覽器為 5個 Firefox、5個 Chrome、1個 IE。
啟動成功後,不只有本機可以查看,其他機器設備也可以查看此狀態。
進入 grid console 的頁面後,點擊 "View Config" 紀錄 host 的 IP 位址。
就可以在其他電腦上查看該 IP 的 grid console 相關資訊了。
如果想要自行設定各個瀏覽器的分配數量。
可以寫一份 json 檔,並在啟動 nodes 的時候呼叫它。
就可以依照自行定義的配置啟動 nodes。
首先先建立一份 nodeConfig.json 檔,可以參考以下範例。
也可以參考 selenium 給的原始檔範例 - github.com/SeleniumHQ/selenium。
注意: 這份 json 檔要與 selenium 的 jar 檔案放在同一層。
{
"capabilities": [
{
"browserName": "firefox",
"marionette": true,
"maxInstances": 1,
"seleniumProtocol": "WebDriver"
},
{
"browserName": "chrome",
"maxInstances": 2,
"seleniumProtocol": "WebDriver"
},
{
"browserName": "safari",
"technologyPreview": false,
"platform": "MAC",
"maxInstances": 3,
"seleniumProtocol": "WebDriver"
}
],
"proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
"maxSession": 5,
"port": -1,
"register": true,
"registerCycle": 5000,
"hub": "http://localhost:4444",
"nodeStatusCheckTimeout": 5000,
"nodePolling": 5000,
"role": "node",
"unregisterIfStillDownAfter": 60000,
"downPollingLimit": 2,
"debug": false,
"servlets": [],
"withoutServlets": [],
"custom": {}
}
存檔後就可以執行下面的指令來啟動 nodes 了。$ java -jar selenium-server-standalone-<version>.jar -role node -nodeConfig nodeConfig.json
如果按照上面的範例將執行會開啟 1個 Firefox、2個 Chrome、3個 Safari。
上面已經簡單的介紹了 hub 與 nodes。
啟動 hub 後會拿到一組 host IP。
所以如果在 Windows 10 的系統上啟動 hub 並獲取 IP。
這個時候是可以透過其他設備來建立 nodes 的。
因此可以透過 Mac 的設備 在 Windows 10 的 hub 中啟動 Safari 的 node。$ java -jar selenium-server-standalone-<version>.jar -role node -hub http://<host IP>:4444
確定步驟 1 與 步驟 2 的 hub 與 node 已經成功啟動。
確定都沒問題後,就可以進行這禮拜內容的最後一個步驟,執行測試。
首先,我們先拿 鼠年全馬鐵人挑戰 WEEK 06:Selenium 自動化測試工具 文章中寫過的測試來進行修改,一樣都是以 python 語言為範例。
原本的程式是長這個樣子。
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://ithelp.ithome.com.tw/users/20124633/articles')
driver.close()
為了執行測試並且回傳測試結果,所以加了一些判斷條件。
from selenium import webdriver
import unittest
driver = webdriver.Chrome()
class selenium_grid (unittest.TestCase):
def test(self):
driver.get('https://google.com')
self.assertEquals('Google', driver.title, 'webpage title are not same')
driver.close()
if __name__ == "__main__":
unittest.main()
再來就是把 driver 的來源,設定為 Selenium Grid 的 Browser。
from selenium import webdriver
import unittest
driver = webdriver.Remote(
# 下面會說明從哪邊拿到這一串
command_executor="http://。<host>:<port>/wd/hub",
desired_capabilities={
"browserName": "chrome",
"browserVersion": "latest",
"platform": "MAC",
"platformName": "MAC",
}
)
class selenium_grid (unittest.TestCase):
def test(self):
driver.get('https://google.com')
self.assertEquals('Google', driver.title, 'webpage title are not same')
driver.close()
if __name__ == "__main__":
unittest.main()
最後再來一次~
執行此份 python 就可以在 node 相對應的 hub 機器上跑測試了~
另外透過 id 後面那一串 host 就可以查看目前 node 使用情況。
http://192.168.xxx.xxx:xxxx/wd/hub/
尚無測試使用時
測試正在執行時
這邊小弟先跟有在關注我文章的大哥大姐們說聲抱歉~
上禮拜沒有如期的發布文章 。゚(゚´ω`゚)゚。
延遲了一週,終於把 Selenium Grid 的東西都整理完了~
感覺內容有點多,希望不會講得太複雜。
到了這週,就已經把所有的 Selenium 的工具都簡單的介紹了一遍了。
如果有疑問或是有錯誤,還請各位大哥大姐提點。
小弟將繼續往下週邁進。 ─=≡Σ((( つ•̀ω•́)つ
Selenium 官方網站
Guru99 - Selenium Grid Tutorial: Hub & Node
Java SE-下載|Oracle技術網|甲骨文
unittest — Unit testing framework
使用 Selenium Grid 的 Python 代碼示例